package controller;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import persistence.ConjuntoMapper;
import view.ConjuntoPanel;
import view.ListaProductosPanel;
import model.Conjunto;
import model.Prenda;

public class ConjuntoController {
	private List<Conjunto> conjuntos;
	private static ConjuntoController instance;
	private boolean fullyLoaded = false;
	private ConjuntoPanel conjuntoPanel;
	
	private ConjuntoController() {
		conjuntos = new ArrayList<Conjunto>();
	}
	
	public static ConjuntoController getInstance() {
		if(instance == null) {
			instance = new ConjuntoController();
		}
		
		return instance;
	}
	
	public boolean altaConjunto(String codigo, String nombre, int descuento, int cantidadStock, List<Prenda> prendas) {
		boolean result = false;
		if(buscarConjunto(codigo) == null){
			Conjunto altaConjunto;
			try {
				altaConjunto = new Conjunto(codigo, nombre, cantidadStock, descuento, prendas);
				conjuntos.add(altaConjunto);
				result = true;
			} catch (SQLException e) {
				result = false;
			}
		} 
		return result;
	}
	
	public boolean modificarConjunto(String codigo, String nuevoCodigo, String nombre, int descuento, int cantidadStock, List<Prenda> prendas) {
		boolean result = false;
		Conjunto modificado = buscarConjunto(codigo);
		if(modificado != null){
			modificado.setCodigo(nuevoCodigo);
			modificado.setNombre(nombre);
			modificado.setDescuento(descuento);
			modificado.setCantidadStock(cantidadStock);
			modificado.setPrendas(prendas);
			result = modificado.modificar();
		}
		return result;
	}	
	
	/**
	 * Busqueda de un conjunto con el codigo recibido.
	 * @param codigo codigo del conjunto a buscar
	 * @return <b>null</b> en caso de que no exista un conjunto con el codigo recibido, el Conjunto correspondiente al codigo buscado
	 */
	public Conjunto buscarConjunto(String codigo){
		Conjunto result = null;
		
		for(Conjunto conjunto: getConjuntos()) {
			if(conjunto.hasCodigo(codigo)) {
				result = conjunto;
				break;
			}
		}
		
		return result;
	}
	
	/**
	 * Metodo que retorna todos los conjuntos existentes 
	 * @return
	 */
	public List<Conjunto> getConjuntos() {
		if(!fullyLoaded) {
			conjuntos = ConjuntoMapper.getInstance().buscarTodos();
			fullyLoaded = true;
		}
		return conjuntos;
	}
	
	public void altaConjuntoPanel() {
		conjuntoPanel= new ConjuntoPanel(PrendaController.getInstance().getPrendas());
		conjuntoPanel.showPanel();
	}

	public boolean mostrarConjunto(String codigo) {
		boolean result = false;
		Conjunto conjunto = buscarConjunto(codigo);
		if(conjunto != null) {
			result = true;
			conjuntoPanel= new ConjuntoPanel(PrendaController.getInstance().getPrendas(), conjunto);
			conjuntoPanel.showPanel();
		}
		return result;
	}

	public boolean bajaConjunto(String codigo) {
		boolean result = false;
		Conjunto conjunto = buscarConjunto(codigo);
		if(conjunto != null) {
			conjunto.eliminar();
			result = conjuntos.remove(conjunto);
		}
		return result;
	}

	public void mostrarConjuntos() {
		ListaProductosPanel productosPanel = new ListaProductosPanel(getConjuntos(), "Conjuntos");
		productosPanel.showPanel();
	}
}
